using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

namespace com.yoozoo.gta.Art.Editor
{
    public class FilesClearEditor : EditorWindow
    {
        private static string _fileName = "TA/TA_ZhgTest/资源列表.csv";
        private static string _searchPath = "Assets/";
        private static bool _isReady;
        private string _btnText = "";
        private static bool _showLog;
        private static bool _showSize;
        private static double _totleFilesSize;

        private static List<string> _readFileName;

        [MenuItem("HRP/资源清理工具")]
        private static void ClearFilesWindows()
        {
            Debug.Log("清理资源启动");
            Init();
            FilesClearEditor window =
                (FilesClearEditor)EditorWindow.GetWindow(typeof(FilesClearEditor), true, "资源清理工具");
            window.Show();
            window.Focus();
        }

        private static void Init()
        {
            _readFileName = new List<string>();
        }

        private void OnGUI()
        {
            GUILayout.Space(10);
            GUI.skin.label.fontSize = 26;
            GUI.skin.label.alignment = TextAnchor.MiddleCenter;
            GUILayout.Label("资源清理工具");
            GUILayout.Space(22);

            GUI.skin.label.fontSize = 12;
            GUI.skin.label.alignment = TextAnchor.MiddleLeft;

            //定义一个用户输入文件名的文本框，并获取文本内容
            GUILayout.Label("请输入.csv格式文件路径(如：Art/资源.csv)：");
            _fileName = GUILayout.TextField(_fileName);
            GUILayout.Space(6);
            GUILayout.Label("待清理文件所在路径(如：Assets/)：");
            _searchPath = GUILayout.TextField(_searchPath);
            GUILayout.Space(3);
            _showLog = GUILayout.Toggle(_showLog, "输出控制台日志");
            GUILayout.Space(3);
            if (_isReady)
            {
                GUILayout.Box("解析到 " + _readFileName.Count + "个文件");
            }
            if (_showSize)
            {
                GUILayout.Box("已删除文件的总大小: " + _totleFilesSize + " MB");
            }
            GUILayout.Space(10);

            _btnText = _isReady ? "开始清理资源" : "文档解析";

            if (GUILayout.Button(_btnText))
            {
                BeginClear();
                Debug.Log(_btnText);
            }
            
            GUILayout.Space(20);
            EditorGUILayout.HelpBox("工具使用说明书：\n"
                                        + "1、csv文件需要先导入到工程中任意一个位置，上面填写路径时不需要加 'Assets/' 。" + "\n"
                                        + "2、csv文件里面如果要加准确的路径不需要加 'Assets/' 如：Art/build.png 即可 。\n"
                                        + "3、待清理文件的路径需要加 'Assets/' 。\n"
                                        + "4、CSV文件中记录的文件名必须加格式后缀，如：.png/.jpg/.prefab等。 \n"
                                        + "5、CSV文件中可单独记录文件名，如：build.png ，也可包含文件路径路径,如：Assets/Art/build.png 。\n"
                                        + "6、勾选‘输出控制台日志‘可以在控制台输出已经删除的文件名和删除失败的文件名。"
                ,MessageType.Info);
        }

        private static void BeginClear()
        {
            if (_isReady == false)
            {
                LoadCsvFile();
                if (_readFileName.Count != 0)
                {
                    _isReady = true;
                }
            }
            else
            {
                DeleteFiles();
                _isReady = false;
            }
        }

        private static void LoadCsvFile()
        {
            _showSize = false;
            string filePath = Path.Combine(Application.dataPath, _fileName);
            if (!File.Exists(filePath))
            {
                Debug.LogError("文件未找到: " + filePath);
                return;
            }

            // 清空列表
            _readFileName.Clear();

            // 打开文件
            using (StreamReader reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    // 分割行
                    string[] values = line.Split(',');
                    
                    if (values.Length > 0)
                    {
                        // 将第一列的值添加到列表中
                        _readFileName.Add(values[0]);
                        if (_showLog)
                        {
                            Debug.Log(values[0]);
                        }
                    }
                }
            }
        }

        private static void DeleteFiles()
        {
            // 获取searchPath下的所有文件，包括子目录中的文件
            string[] allFiles = Directory.GetFiles(_searchPath, "*.*", SearchOption.AllDirectories);

            // 初始化已删除文件的总大小（以字节为单位）
            float totalSize = 0;

            // 遍历_readFileName列表
            for (int i = 0; i < _readFileName.Count; i++)
            {
                string file = _readFileName[i];

                // 尝试使用文件路径
                string filePath = Path.Combine(Application.dataPath, file);

                // 检查文件是否存在
                if (File.Exists(filePath))
                {
                    // 获取文件大小
                    FileInfo fileInfo = new FileInfo(filePath);
                    totalSize += fileInfo.Length;

                    // 删除文件
                    File.Delete(filePath);
                    if (_showLog)
                    {
                        Debug.LogWarning("已删除文件: " + filePath);
                    }
                }
                else
                {
                    // 在所有文件中搜索文件名
                    string foundFilePath = Array.Find(allFiles, path => Path.GetFileName(path) == file);

                    // 检查文件是否存在
                    if (foundFilePath != null)
                    {
                        // 获取文件大小
                        FileInfo fileInfo = new FileInfo(foundFilePath);
                        totalSize += fileInfo.Length;

                        // 删除文件
                        File.Delete(foundFilePath);
                        if (_showLog)
                        {
                            Debug.LogWarning("已删除文件: " + foundFilePath);
                        }
                    }
                    else
                    {
                        Debug.LogError("删除失败，文件未找到（请检查文件是否存在，或CSV中该文件名是否准确）: " + file);
                    }
                }

                // 更新进度条
                float progress = (float)i / _readFileName.Count;
                EditorUtility.DisplayProgressBar("文件清理中 (如果卡住请检查文件名是否含有'逗号/句号/分号等非法字符')", $"已经删除文件 {i + 1} of {_readFileName.Count}" + " 文件名：" + _readFileName[i], progress);
            }

            // 清除进度条
            EditorUtility.ClearProgressBar();

            _readFileName.Clear();

            // 计算已删除文件的总大小（以MB为单位）
            double totalSizeInMB = totalSize / (1024.0 * 1024.0);
            _totleFilesSize = totalSizeInMB;
            _showSize = true;
            Debug.LogWarning("已删除文件的总大小: " + totalSizeInMB + " MB");
        }

        private void OnDisable()
        {
            // 清理_readFileName列表
            if (_readFileName != null)
            {
                _readFileName.Clear();
            }
            
        }
    }
}